package dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import dto.ItemOrdenCompraCCDTO;
import dto.MateriaPrimaAPedirDTO;
import dto.MateriaPrimaDTO;
import dto.OrdenCompraCCDTO;
import entities.ItemMateriaPrimaRodamiento;
import entities.MateriaPrima;
import entities.Rodamiento;

/**
 * Session Bean implementation class VentaRodamientoDAOBean
 */
@Stateless
public class VentaRodamientoDAOBean implements VentaRodamientoDAO {

	@EJB
	private RodamientoDAO admRodamientoDAO;
	@EJB
	private MateriaPrimaDAO admMateriaPrimaDAO;
	
    public VentaRodamientoDAOBean() {
        // TODO Auto-generated constructor stub
    }

	@Override
	public List<MateriaPrimaAPedirDTO> venderRodamientos(
			OrdenCompraCCDTO ordenCompraDTO) {
		Map<String, Integer> materiaPrimaAPedir = calcularMateriaPrimaAPedir(ordenCompraDTO);
		return verificarStockMateriasPrimas(materiaPrimaAPedir);
	}
	
	private HashMap<String,Integer> calcularMateriaPrimaAPedir(OrdenCompraCCDTO ocDTO){
		HashMap<String, Integer> materiaPrimaAPedir = new HashMap<String, Integer>();
		Integer cantidadAcum;
		for (ItemOrdenCompraCCDTO itemOrdenCompraDTO : ocDTO.getItemOCCCDTO()) {
			Rodamiento rod = admRodamientoDAO.obtenerRodamiento(itemOrdenCompraDTO.getRodamiento().getCodigoRodamiento());
			int cantidadRodamiento = itemOrdenCompraDTO.getCantidad();
			for (ItemMateriaPrimaRodamiento itemMateriaPrima : rod.getListaMateriasPrima()) {
				if(materiaPrimaAPedir.get(itemMateriaPrima.getMateriaPrima()) != null)
					cantidadAcum = materiaPrimaAPedir.get(itemMateriaPrima.getMateriaPrima());
				else
					cantidadAcum = 0;
				cantidadAcum+=cantidadRodamiento*itemMateriaPrima.getCantidad();
				materiaPrimaAPedir.put(itemMateriaPrima.getMateriaPrima().getCodigo(), cantidadAcum);
			}
		}
		return materiaPrimaAPedir;
	}
	
	private List<MateriaPrimaAPedirDTO> verificarStockMateriasPrimas(Map materiasPrimasNecesarias){
		List<MateriaPrima> listaMateriasPrimas = admMateriaPrimaDAO.getListaMateriaPrima();
		Integer cantidadMateriaPrima = 0 ;
		List<MateriaPrimaAPedirDTO> materiasPrimasAPedirDTO = new ArrayList<MateriaPrimaAPedirDTO>();
		for (MateriaPrima materiaPrima : listaMateriasPrimas) {
			if(materiasPrimasNecesarias.get(materiaPrima.getCodigo())!=null){
				cantidadMateriaPrima = (Integer)materiasPrimasNecesarias.get(materiaPrima.getCodigo());
				if(materiaPrima.getStock() >= cantidadMateriaPrima){
					materiaPrima.setStock(materiaPrima.getStock()-cantidadMateriaPrima);
					admMateriaPrimaDAO.actualizarMateriaPrima(materiaPrima);
				}
				else{
					cantidadMateriaPrima = (cantidadMateriaPrima-materiaPrima.getStock())*2;
					materiaPrima.setStock(0);
					admMateriaPrimaDAO.actualizarMateriaPrima(materiaPrima);
					materiasPrimasAPedirDTO.add(new MateriaPrimaAPedirDTO(materiaPrima,cantidadMateriaPrima));
				}
			}
		}
		return materiasPrimasAPedirDTO;
		
	}
    
    

}
